package fr.afcepf.atod16.groupe1.projet2.serviceProduit;

import fr.afcepf.atod16.groupe1.projet2.dao.DaoProduitStock;
import fr.afcepf.atod16.groupe1.projet2.dto.DtoProduitStock;
import fr.afcepf.atod16.groupe1.projet2.exception.ActivationException;
import fr.afcepf.atod16.groupe1.projet2.exception.ExistException;
import fr.afcepf.atod16.groupe1.projet2.exception.InvalidArgumentException;
import fr.afcepf.atod16.groupe1.projet2.exception.NotExistException;
import java.io.Serializable;
import java.util.Date;
import java.util.List;
import javax.ejb.EJB;
import javax.ejb.Stateless;
import javax.jws.WebService;

/**
 * Service métier de gestion des produits
 * @author cedric
 */
@Stateless
@WebService(endpointInterface="fr.afcepf.atod16.groupe1.projet2.serviceProduit.ServiceProduitStockWebservice", serviceName="ServiceProduit")
public class ServiceProduitStock implements ServiceProduitStockLocal, ServiceProduitStockWebservice, Serializable {
    
    @EJB
    private DaoProduitStock dao;

    public ServiceProduitStock() {
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public List<DtoProduitStock> getListe() {
        return dao.lister();
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public boolean creerProduit(String codeEAN13) throws ExistException, InvalidArgumentException {
        if(!codeEAN13.matches("^[0-9]{13}$")) {
            throw new InvalidArgumentException("Le code EAN13 fourni est incorrect ! (Attendu : 13 chiffres)");
        }
        else {
            DtoProduitStock existant = dao.rechercherParCodeEAN13(codeEAN13);
            if(existant == null) {
                DtoProduitStock dtoProduit = new DtoProduitStock();
                dtoProduit.setActif(true);
                dtoProduit.setCodeEAN13(codeEAN13);
                dtoProduit.setStock(0);
                dtoProduit.setDateCreation(new Date());
                dao.ajouter(dtoProduit);
            }
            else {
                throw new ExistException("Il existe déja un produit de code EAN13 = "+codeEAN13);
            }
        }
        return true;
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public boolean desactiverProduit(String codeEAN13) throws InvalidArgumentException, NotExistException, ActivationException {
        if(!codeEAN13.matches("^[0-9]{13}$")) {
            throw new InvalidArgumentException("Le code EAN13 fourni est incorrect ! (Attendu : 13 chiffres)");
        }
        else {
            DtoProduitStock existant = dao.rechercherParCodeEAN13(codeEAN13);
            if(existant == null) {
                throw new NotExistException("Il n'existe pas de produit de code EAN13 = "+codeEAN13);
            }
            else {
                if(existant.getActif() == false) {
                    throw new ActivationException("Produit déja désactivé !");
                }
                else {
                    existant.setActif(false);
                    dao.modifier(existant);
                }
            }
        }
        return true;
    }
}
